package redisluainit

import (
	"fmt"
	"hotMoney/data"
)

const rewardScript = `
	-- KEYS[1]: 用户去重的hash key，用于检测是否已经抢过积分
	-- KEYS[2]:	用户名
	-- KEYS[3]: 未消费的积分队列
	-- KEYS[4]: 已消费的积分队列
	-- 如果用户已抢过积分，则返回nil
	-- 0:用户已经抢过积分，不能再抢第二次  -1:积分已经抢完   1:获取积分成
	-- 检查用户是否已经抢过积分
	local userReward = redis.call("SISMEMBER", KEYS[1], KEYS[2]);
	if (userReward == 1) 
	then
		return 0;
	end
	-- 判断积分是否已经抢完了
	local len = redis.call("llen", KEYS[3]);
	if (len == 0)
	then
		return -1;
	end
	-- 还有剩余，从未消费的积分队列中取一个id
	local id = redis.call("RPOP", KEYS[3]);
	-- 将取走的积分id放入已消费的队列中
	redis.call("RPUSH", KEYS[4], id);
	--将已抢过积分的user放入redis中
	redis.call("SADD",KEYS[1], KEYS[2]);
	-- 返回id
	return tonumber(id);
	`

func CacheGetReward(key1, username, key2, key3 string) int {
	//执行抢积分的lua脚本（也可以预先缓存到redis中，这里为了方便就这么写）
	res ,err := data.EvalSHA(rewardScript, []string{key1, username, key2, key3})
	fmt.Println("the rewardres is: ", res)
	if err != nil {
		fmt.Println("the rewardlua err is: ", err)
		return -2
	}
	switch {
	case res.(int64) == 0:
		fmt.Println("用户已经抢过积分，不能再抢")
		return 0
	case res.(int64) == -1:
		fmt.Println("积分已经抢完")
		return -1
	case res.(int64) > 0:
		fmt.Println("抢到积分，返回")
		return int(res.(int64))
	default:
		fmt.Println("发生预期之外的错误")
		return -2
	}
}
